/**
 * Created by Yu Jin Xian on 2016/12/7.
 */
function newArrays() {
    var colors = new Array();

    function capacity() {
        var colors = new Array(20)
    }

    function assign() {
        var colors = new Array('red', 'blue', 'green');
    }

    function singleParameter() {
        var colors = new Array(3);              // 创建一个包含 3 项的数组
        var nanes = new Array('Greg');          // 创建一个包含 1 项的数组, 即字符串 "Greg" 的数组
    }

    function omit() {
        var colors = Array(3);                  // 创建一个包含 3 项的数组
        var names = Array('greg');              // 创建一个包含 1 项的数组, 即字符串 "Greg" 的数组
    }

    function literals() {
        var colors = ['red', 'blue', 'green'];  // 创建一个包含 3 个字符串的数组
        var names = [];                         // 创建一个空数组
        var values = [1, 2,];                   // 不要这样! 这样会创建一个包含 2 或 3 项的数组
        var options = [, , , , , ,];            // 不要这样! 这样会创建一个包含 5 或 6 项的数组
    }

    function userColors() {
        var colors = ['red', 'blue', 'green'];  // 定义一个字符串数组
        alert(colors[0]);                       // 显示第一项
        colors[2] = 'black';                    // 修改第三项
        colors[3] = 'brown';                    // 新增第三项
    }

    function arrayLength() {
        var colors = ['red', 'blue', 'green'];  // 创建一个包含 3 项的数组
        var names = [];                         // 创建一个空数组
        alert(colors.length);                   // 3
        alert(names.length);                    // 0
    }

    function addItem() {
        var colors = ['red', 'blue', 'green'];  // 创建一个包含 3 项的数组
        colors.length = 2;
        alert(colors[2]);                       // undefined
    }

    function addMultiItem() {
        var colors = ['red', 'blue', 'green'];  // 创建一个包含 3 项的数组
        colors.length = 4;
        alert(colors[3]);                       // undefined
    }

    function useLengthAddItem() {
        var colors = ['red', 'blue', 'green'];  // 创建一个包含 3 项的数组
        colors[colors.length] = 'black';        // (在位置 3) 添加一种颜色
        colors[colors.length] = 'brown';        // (在位置 4) 添加一种颜色
    }

    function useLengthAddItem2() {
        var colors = ['red', 'blue', 'green'];  // 创建一个包含 3 项的数组
        colors[99] = 'black';                   // (在位置 99) 添加一种颜色
        colors[colors.length] = 100;            // 100
    }
}

function determineTypes() {
    var value = [];
    if (value instanceof Array) {
        // 对数组执行某些操作
    }

    if (Array.isArray(value)) {
        // 对数组执行某些操作
    }
}

function convertMethods() {
    var colors = ['red', 'blue', 'green'];      // 创建一个包含 3 项的数组
    alert(colors.toString());                   // red,blue,green
    alert(colors.valueOf());                    // red,blue,green
    alert(colors);                              // red,blue,green

    function toLocalString() {
        var person1 = {
            toLocalString: function () {
                return 'Nikolaos';
            },

            toString: function () {
                return 'Nicholas'
            }
        };

        var person2 = {
            toLocalString: function () {
                return 'Grigorios';
            },

            toString: function () {
                return 'Greg'
            }
        };

        var person = [person1, person2];
        alert(person);                          // Nicholas,Greg
        alert(person.toString());               // Nicholas,Greg
        alert(person.toLocaleString());         // Nickolaos,Grigorios
    }

    function join() {
        var colors = ['red', 'blue', 'green'];   // 创建一个包含 3 项的数组
        alert(colors.join(','));                 // red,blue,green
        alert(colors.join('||'));                // red||blue||green
    }
}

function stackMethods() {
    var colors = new Array();                   // 创建一个数组
    var count = colors.push('red', 'green');    // 推入两项
    alert(count);                               // 2

    count = colors.push('black');               // 推入另一项
    alert(count);                               // 3

    var item = colors.pop();                    // 取得最后一项
    alert(item);                                // "black"
    alert(colors.length);                       // 2

    function or() {
        var colors = ['red', 'blue'];
        colors.push('brown');                   // 添加另一项
        colors[3] = 'black';                    // 添加一项
        alert(colors.length);                   // 4

        var item = colors.pop();                // 取得最后一项
        alert(item);                            // "black"
    }
}

function queueMethods() {
    var colors = new Array();                   // 创建一个数组
    var count = colors.push('red', 'green');    // 推入两项
    alert(count);                               // 2

    count = colors.push('black');               // 推入另一项
    alert(count);                               // 3

    var item = colors.shift();                  // 取得第一项
    alert(item);                                // "red"
    alert(colors.length);

    function reverse() {
        var colors = new Array();                   // 创建一个数组
        var count = colors.unshift('red', 'green'); // 推入两项
        alert(count);                               // 2

        count = colors.unshift('black');            // 推入另一项
        alert(count);

        var item = colors.pop();                    // 取得最后一项
        alert(item);                                // "green"
        alert(colors.length);                       // 2
    }
}

function sortMethods() {
    var values = [1, 2, 3, 4, 5];
    values.reverse();
    alert(values);                              // 5,4,3,2,1

    function sort() {
        var values = [0, 1, 5, 10, 15];
        values.sort();
        alert(values);                          // 0,1,10,15,5
    }

    function compare(value1, value2) {
        if (value1 < value2) {
            return -1;
        } else if (value1 > value2) {
            return 1;
        } else {
            return 0;
        }
    }

    function customSort() {
        var values = [0, 1, 5, 10, 15];
        values.sort(compare);
        alert(values);                          // 0,1,5,10,15
    }

    function descendingOrder() {
        function compare(value1, value2) {
            if (value1 < value2) {
                return 1;
            } else if (value1 > value2) {
                return -1;
            } else {
                return 0;
            }
        }

        var values = [0, 1, 5, 10, 15];
        values.sort(compare);
        alert(values);                          // 15,10,5,1,0
    }

    function better() {
        function compare(value1, value2) {
            return value2 - value1;
        }
    }
}

function operaterMethods() {
    function concat() {
        var colors = ['red', 'green', 'blue'];
        var colors2 = colors.concat('yellow', ['black', 'brown']);
        alert(colors);                          // red,green,blue
        alert(colors2);                         // red,green,blue,yellow,black,brown
    }

    function slice() {
        var colors = ['red', 'green', 'blue', 'yellow', 'purple'];
        var colors2 = colors.splice(1);
        var colors3 = colors.splice(1, 4);
        alert(colors);                          // red,green,blue,yellow,purple
        alert(colors2);                         // red,green,blue,yellow
    }

    function splice() {
        var colors = ['red', 'green', 'blue'];
        var removed = colors.splice(0, 1);      // 删除第一项
        alert(colors);                          // green,blue
        alert(removed);                         // red, 返回的数组只包含一项

        removed = colors.splice(1, 0, 'yellow', 'oragne');  // 从位置 1 开始插入两项
        alert(colors);                          // green,yellow,oragne,blue
        alert(removed);                         // 返回的是一个空数组

        removed = colors.splice(1, 1, 'red', 'purple');     // 插入两项, 删除一项
        alert(colors);                          // green,red,purple,oragne,blue
        alert(removed);                         // yellow, 返回的数组中只包含一项
    }
}

function locationMethods() {
    var numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];
    alert(numbers.indexOf(4));                  // 3
    alert(numbers.lastIndexOf(4));              // 5
    alert(numbers.indexOf(4, 4));               // 5
    alert(numbers.lastIndexOf(4, 4));           // 3

    var person = {name: 'Nicholas'};
    var people = [{name: 'Nicholas'}];
    var morePeople = [person];
    alert(people.indexOf(person));              // -1
    alert(morePeople.indexOf(person));          //0
}

function iterativeMethods() {
    var numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];
    var everyResult = numbers.every(function (item, index, array) {
        return item > 2;
    });
    alert(everyResult);                         // false

    var someResult = numbers.some(function (item, index, array) {
        return item > 2;
    });
    alert(someResult);                          // true

    function filter() {
        var numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];
        var filterResult = numbers.filter(function (item, index, array) {
            return item > 2;
        });
        alert(filterResult);                    // [3,4,5,4,3]
    }

    function map() {
        var numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];
        var mapResult = numbers.map(function (item, index, array) {
            return item * 2;
        });
        alert(mapResult);                       // [2,4,6,8,10,8,6,4,2]
    }

    function forEach() {
        var numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];
        numbers.forEach(function (item, index, array) {
            // 执行某些操作
        });
    }

    function reduce() {
        var values = [1, 2, 3, 4, 5];
        var sum = values.reduce(function (prev, cur, index, array) {
            return prev + cur;
        });
        alert(sum);                             // 15
    }

    function reduceRight() {
        var values = [1, 2, 3, 4, 5];
        var sum = values.reduceRight(function (prev, cur, index, array) {
            return prev + cur;
        });
        alert(sum);                             // 15
    }
}